Comparable এবং Comparator ইন্টারফেসগুলি Java-তে sorting বা ordering এর জন্য ব্যবহৃত হয়। এই দুটি ইন্টারফেস Java Collections Framework এর একটি গুরুত্বপূর্ণ অংশ, এবং তারা ডেটা স্ট্রাকচারগুলির (যেমন List, Set, Map) এলিমেন্টগুলির অর্ডার নির্ধারণ করতে সহায়ক হয়।
1. Comparable Interface
Comparable ইন্টারফেসটি একটি ক্লাসের ভিতরে ইমপ্লিমেন্ট করা হয় যখন আমরা চাই সেই ক্লাসের অবজেক্টগুলিকে স্বয়ংক্রিয়ভাবে সাজানো (sort) করা হোক। এটি compareTo() মেথড প্রদান করে, যা দুটি অবজেক্টের তুলনা করে এবং তাদের অর্ডার নির্ধারণ করে।
compareTo()মেথডে তিনটি রিটার্ন মান থাকতে পারে:0: যদি দুটি অবজেক্ট সমান হয়।<0: যদি বর্তমান অবজেক্টটি তুলনামূলকভাবে ছোট হয়।>0: যদি বর্তমান অবজেক্টটি তুলনামূলকভাবে বড় হয়।
ব্যবহার:
Comparable ইন্টারফেসটি তখন ব্যবহার করা হয় যখন ক্লাসের অবজেক্টগুলির মধ্যে অর্ডার প্রাক-নির্ধারিত থাকতে হবে (যেমন নামের অর্ডার, বয়সের অর্ডার ইত্যাদি)।
Example:
import java.util.*;
class Student implements Comparable<Student> {
String name;
int age;
Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Student other) {
// Compare students based on age
return this.age - other.age; // Ascending order based on age
}
@Override
public String toString() {
return "Name: " + name + ", Age: " + age;
}
}
public class ComparableExample {
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
students.add(new Student("John", 22));
students.add(new Student("Alice", 20));
students.add(new Student("Bob", 23));
Collections.sort(students); // Sorting using Comparable
for (Student student : students) {
System.out.println(student);
}
}
}
Output:
Name: Alice, Age: 20
Name: John, Age: 22
Name: Bob, Age: 23
ব্যাখ্যা:
- এখানে
Studentক্লাসComparable<Student>ইন্টারফেস ইমপ্লিমেন্ট করেছে।compareTo()মেথডের মাধ্যমে ছাত্রদের বয়স অনুসারে তাদের অর্ডার সাজানো হয়েছে।
2. Comparator Interface
Comparator ইন্টারফেসটি তখন ব্যবহৃত হয় যখন আপনি কাস্টম সাজানোর জন্য একটি তুলনা কৌশল প্রয়োগ করতে চান বা যদি আপনি চান বিভিন্ন ক্ষেত্র (যেমন বয়স, নাম) অনুযায়ী একটি অবজেক্টের তালিকা সাজানো হোক। এটি compare() মেথড প্রদান করে যা দুটি অবজেক্টের তুলনা করে।
compare()মেথডেও তিনটি রিটার্ন মান থাকতে পারে:0: যদি দুটি অবজেক্ট সমান হয়।<0: যদি প্রথম অবজেক্টটি তুলনামূলকভাবে ছোট হয়।>0: যদি প্রথম অবজেক্টটি তুলনামূলকভাবে বড় হয়।
ব্যবহার:
Comparator ইন্টারফেসটি তখন ব্যবহার করা হয় যখন আপনি চাইছেন একাধিকভাবে সাজানো অথবা একাধিক criteria অনুযায়ী ডেটা সাজানো।
Example:
import java.util.*;
class Student {
String name;
int age;
Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Name: " + name + ", Age: " + age;
}
}
class AgeComparator implements Comparator<Student> {
@Override
public int compare(Student s1, Student s2) {
return s1.age - s2.age; // Sorting by age
}
}
class NameComparator implements Comparator<Student> {
@Override
public int compare(Student s1, Student s2) {
return s1.name.compareTo(s2.name); // Sorting by name
}
}
public class ComparatorExample {
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
students.add(new Student("John", 22));
students.add(new Student("Alice", 20));
students.add(new Student("Bob", 23));
// Sorting by age
Collections.sort(students, new AgeComparator());
System.out.println("Sorted by Age:");
for (Student student : students) {
System.out.println(student);
}
// Sorting by name
Collections.sort(students, new NameComparator());
System.out.println("\nSorted by Name:");
for (Student student : students) {
System.out.println(student);
}
}
}
Output:
Sorted by Age:
Name: Alice, Age: 20
Name: John, Age: 22
Name: Bob, Age: 23
Sorted by Name:
Name: Alice, Age: 20
Name: Bob, Age: 23
Name: John, Age: 22
ব্যাখ্যা:
- এখানে
AgeComparatorএবংNameComparatorদুটি আলাদা কাস্টমComparatorইন্টারফেস ইমপ্লিমেন্টেশন তৈরি করা হয়েছে। প্রথমে আমরাAgeComparatorব্যবহার করে তালিকাটি বয়স অনুযায়ী সাজিয়েছি এবং পরেNameComparatorব্যবহার করে নাম অনুযায়ী সাজিয়েছি।
Comparable এবং Comparator এর পার্থক্য
| Property | Comparable | Comparator |
|---|---|---|
| Method | compareTo(T o) | compare(T o1, T o2) |
| Usage | একক class এর জন্য স্বয়ংক্রিয় সজ্জা (sorting) | একাধিক criteria বা কাস্টম সাজানোর জন্য |
| Implementation Location | Class এর মধ্যে ইমপ্লিমেন্ট করা হয় | আলাদা একটি Comparator class তৈরি করতে হয় |
| Number of Comparisons | একটি single comparison ক্লাসের উপর | একাধিক comparison ক্রাইটেরিয়া (যেমন বয়স, নাম) |
| Support for Sorting | শুধুমাত্র natural sorting এর জন্য | Multiple sorting strategies এর জন্য |
| Null Handling | Null handling করতে হয় নিজেই | Null handling এর জন্য nullsFirst() এবং nullsLast() ফিচার রয়েছে |
কোন সময় Comparable এবং Comparator ব্যবহার করবেন?
Comparableব্যবহার করুন:- যখন আপনি কোনো class এর অবজেক্টগুলিকে স্বাভাবিকভাবে (natural order) সাজাতে চান।
- যখন আপনার কেবল এক ধরনের তুলনা প্রক্রিয়া প্রয়োজন (যেমন age, name অথবা salary এর উপর ভিত্তি করে)।
Comparatorব্যবহার করুন:- যখন আপনি কাস্টম sorting criteria (যেমন একাধিক ফিল্ড, ভিন্ন কাস্টম তুলনা পদ্ধতি) ব্যবহার করতে চান।
- যখন আপনাকে multiple sorting strategies প্রয়োগ করতে হবে, যেমন একবার বয়স অনুযায়ী সাজানো, পরবর্তীতে নাম অনুযায়ী সাজানো।
Comparable এবং Comparator উভয়ই Java Collections Framework-এ অর্ডার এবং সজ্জার জন্য ব্যবহৃত হয়। Comparable ক্লাসের মধ্যে সোজাসুজি compareTo() মেথড ইমপ্লিমেন্ট করে সজ্জা করা হয়, যেখানে Comparator ক্লাসের মাধ্যমে আপনি আলাদা আলাদা কাস্টম সাজানোর কৌশল প্রয়োগ করতে পারেন। সাধারণত, আপনি Comparable ব্যবহার করবেন যখন একক ধরনের তুলনা এবং natural order সাজাতে চান, এবং Comparator ব্যবহার করবেন যখন আপনাকে একাধিক কাস্টম সাজানোর পদ্ধতি বা একাধিক ফিল্ডের উপর ভিত্তি করে সাজাতে হবে।
Comparable ইন্টারফেসটি Java.util প্যাকেজের একটি গুরুত্বপূর্ণ অংশ, যা কোনো ক্লাসের natural ordering (প্রাকৃতিক ক্রম) নির্ধারণ করতে ব্যবহৃত হয়। যখন একটি ক্লাস Comparable ইন্টারফেসকে ইমপ্লিমেন্ট করে, তখন আপনি সেই ক্লাসের অবজেক্টগুলিকে সরাসরি sorting বা ordering করতে পারবেন। Natural ordering এমন একটি প্রক্রিয়া, যেখানে কোনো ক্লাসের অবজেক্টগুলি নিজের মধ্যে এক প্রাকৃতিক ক্রম অনুসারে সাজানো হয়। সাধারণত, compareTo() মেথডটি এই ক্রম নির্ধারণ করতে ব্যবহৃত হয়।
Comparable Interface এর উদ্দেশ্য এবং বৈশিষ্ট্য:
- Natural Ordering:
Comparableইন্টারফেসের মূল উদ্দেশ্য হলো কোনো ক্লাসের অবজেক্টের জন্য একটি প্রাকৃতিক ক্রম (natural order) স্থাপন করা, যেমন ছোট থেকে বড় বা বড় থেকে ছোট।
- compareTo() Method:
compareTo()মেথডটিComparableইন্টারফেসের একটি একমাত্র মেথড, যা দুইটি অবজেক্টের মধ্যে তুলনা করে এবং সেগুলির মধ্যে যে ক্রম আছে তা ফেরত দেয়।- Return values:
- 0: যদি দুটি অবজেক্ট সমান হয়।
- Negative value: যদি প্রথম অবজেক্টটি দ্বিতীয় অবজেক্টের চেয়ে ছোট হয়।
- Positive value: যদি প্রথম অবজেক্টটি দ্বিতীয় অবজেক্টের চেয়ে বড় হয়।
Comparable Interface এর Syntax:
public interface Comparable<T> {
public int compareTo(T o);
}
এখানে T হচ্ছে যে টাইপের অবজেক্ট আপনি তুলনা করতে চান।
Comparable Interface এর মাধ্যমে Natural Ordering উদাহরণ:
1. Integer এর জন্য Natural Ordering
Integer ক্লাস ইতিমধ্যেই Comparable ইন্টারফেস ইমপ্লিমেন্ট করে এবং এতে প্রাকৃতিক ক্রম হিসেবে ছোট থেকে বড় (ascending order) সংখ্যা সাজানো হয়। নিচে Integer এর প্রাকৃতিক ক্রম ব্যবহার করার উদাহরণ দেখানো হয়েছে:
import java.util.ArrayList;
import java.util.Collections;
public class ComparableExample {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(3);
numbers.add(7);
numbers.add(5);
// Sorting the list using natural ordering (ascending order)
Collections.sort(numbers);
System.out.println("Sorted List: " + numbers);
}
}
Output:
Sorted List: [3, 5, 7, 10]
ব্যাখ্যা:
- এখানে
Integerক্লাসের natural ordering (ascending order) ব্যবহার করা হয়েছে, যাতে সংখ্যাগুলো ছোট থেকে বড় অর্ডারে সাজানো হয়েছে। Collections.sort()মেথডটিComparableইন্টারফেসের মাধ্যমে প্রাকৃতিক ক্রম অনুযায়ী তালিকাটি সাজিয়ে দেয়।
2. Custom Class এর জন্য Natural Ordering
ধরা যাক, আমাদের একটি Student ক্লাস আছে এবং আমরা চাই শিক্ষার্থীদের নামের ভিত্তিতে তাদের সাজাতে। এর জন্য, আমরা Student ক্লাসে Comparable ইন্টারফেস ইমপ্লিমেন্ট করব এবং compareTo() মেথডে নামের ভিত্তিতে ক্রম নির্ধারণ করব।
import java.util.ArrayList;
import java.util.Collections;
class Student implements Comparable<Student> {
String name;
int age;
// Constructor
public Student(String name, int age) {
this.name = name;
this.age = age;
}
// Overriding compareTo() method to compare students by name
@Override
public int compareTo(Student other) {
return this.name.compareTo(other.name);
}
@Override
public String toString() {
return name + " (" + age + " years old)";
}
}
public class ComparableStudentExample {
public static void main(String[] args) {
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("John", 22));
students.add(new Student("Alice", 20));
students.add(new Student("Bob", 21));
// Sorting the list of students based on their names (natural ordering)
Collections.sort(students);
// Display the sorted list
for (Student student : students) {
System.out.println(student);
}
}
}
Output:
Alice (20 years old)
Bob (21 years old)
John (22 years old)
ব্যাখ্যা:
Studentক্লাসেComparable<Student>ইন্টারফেস ইমপ্লিমেন্ট করা হয়েছে এবংcompareTo()মেথডের মাধ্যমেnameফিল্ডের ওপর ভিত্তি করে শিক্ষার্থীদের নামের অর্ডারে সাজানো হয়েছে।Collections.sort()মেথডের মাধ্যমে শিক্ষার্থীদের নামের ভিত্তিতে প্রাকৃতিক ক্রমে (alphabetically) সাজানো হয়েছে।
Comparable Interface এর প্রয়োগের সুবিধা:
- Sorting:
- যখন কোনো ক্লাস
Comparableইন্টারফেস ইমপ্লিমেন্ট করে, তখন সেই ক্লাসের অবজেক্টগুলি সহজে sorting করা যায়।Collections.sort()মেথডের মাধ্যমে তালিকা সাজানো যায়।
- যখন কোনো ক্লাস
- Natural Ordering:
compareTo()মেথডের মাধ্যমে আপনি ক্লাসের অবজেক্টগুলির মধ্যে প্রাকৃতিক ক্রম স্থাপন করতে পারেন। এটি সাধারণত সংখ্যার ক্রম, অক্ষরের ক্রম (alphabetical order), বা অন্যান্য বৈশিষ্ট্য ভিত্তিক হতে পারে।
- Custom Sorting:
- Comparable ব্যবহার করে আপনি সহজেই কাস্টম ক্রম নির্ধারণ করতে পারেন, যেমন শিক্ষার্থীদের নাম বা বয়সের ওপর ভিত্তি করে ক্রম নির্ধারণ করা।
- Comparator vs Comparable:
Comparableএকক ক্রম নির্ধারণের জন্য ব্যবহৃত হয়, তবেComparatorআরও বেশি কাস্টমাইজযোগ্য এবং একাধিক ক্রম সংজ্ঞায়িত করতে ব্যবহৃত হয়।Comparableপ্রাকৃতিক ক্রমের জন্য এবংComparatorকাস্টম ক্রমের জন্য ব্যবহৃত হয়।
Comparable Interface এবং Sorting
Comparableইন্টারফেসের মাধ্যমে natural ordering নির্ধারণ করা যায়, যা সরাসরিCollections.sort()বা Arrays.sort()` মেথডের মাধ্যমে প্রয়োগ করা যায়।- যদি আপনি একাধিক প্রপার্টি (যেমন বয়স, নাম, বা গড় নম্বর) এর ওপর ভিত্তি করে সাজাতে চান, তবে
Comparatorব্যবহার করতে হবে।
Example: Sorting by Multiple Fields Using Comparator
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
class Student {
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name + " (" + age + " years old)";
}
}
public class StudentSortingExample {
public static void main(String[] args) {
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("John", 22));
students.add(new Student("Alice", 20));
students.add(new Student("Bob", 21));
// Sorting by age, then by name
Collections.sort(students, Comparator.comparingInt((Student s) -> s.age)
.thenComparing(s -> s.name));
// Display the sorted list
for (Student student : students) {
System.out.println(student);
}
}
}
Output:
Alice (20 years old)
Bob (21 years old)
John (22 years old)
ব্যাখ্যা:
- এখানে
Comparator.comparingInt()এবংthenComparing()ব্যবহার করা হয়েছে যাতে প্রথমে age এবং পরে name এর ওপর ভিত্তি করে শিক্ষার্থীদের সাজানো যায়।
Comparableইন্টারফেস Java Collections Framework এর একটি গুরুত্বপূর্ণ অংশ, যা natural ordering নির্ধারণ করার জন্য ব্যবহৃত হয়।compareTo()মেথডের মাধ্যমে আপনিComparableইন্টারফেসের অবজেক্টগুলির মধ্যে ক্রম নির্ধারণ করতে পারেন, যা sorting এবং comparing সহজ করে তোলে।Comparableক্লাসের প্রয়োগেCollections.sort()এবংArrays.sort()মেথডগুলি সহজে ব্যবহার করা যায়।
Comparator ইন্টারফেসটি Java Collections Framework এর একটি গুরুত্বপূর্ণ অংশ এবং এটি ব্যবহারকারীদের তাদের নিজস্ব custom sorting লজিক তৈরি করতে সক্ষম করে। এটি সাধারণত ব্যবহার করা হয় যখন আপনি List, Set, Map ইত্যাদির উপাদানগুলোকে নিজস্ব কাস্টম অর্ডারে সাজাতে চান।
Comparator ইন্টারফেসের মাধ্যমে আপনি দুটি অবজেক্টের মধ্যে তুলনা করার জন্য একটি comparison logic সরবরাহ করতে পারেন এবং তারপর সেই তুলনামূলক লজিকের মাধ্যমে উপাদানগুলোকে সাজাতে পারেন। এটি natural ordering এর বাইরে যাওয়ার জন্য ব্যবহৃত হয় এবং যখন আপনার প্রয়োজন হয় তখন কাস্টম নিয়মে সাজানোর সুবিধা প্রদান করে।
Comparator Interface এর বৈশিষ্ট্য:
- Custom Sorting Logic: Comparator ইন্টারফেস ব্যবহার করে আপনি আপনার নিজের custom sorting logic তৈরি করতে পারেন, যেমন কোন নির্দিষ্ট ক্ষেত্রের উপর ভিত্তি করে সজ্জিত করা।
- Multiple Sorting Criteria: এটি একাধিক criteria বা ফিল্ডের ভিত্তিতে উপাদানগুলোকে সাজাতে সাহায্য করতে পারে।
- Reverse Order: আপনি Comparator.reverseOrder() মেথড ব্যবহার করে সহজেই একটি উল্টো (descending) অর্ডারে সাজাতে পারেন।
- Non-Destructive: Comparator ইন্টারফেসটি কোনো পরিবর্তন ছাড়া নতুন Comparator তৈরি করে, যার মানে এটি কোনো আসল ডেটা বা অবজেক্টের অবস্থান পরিবর্তন করে না।
- Flexible: Comparator ব্যবহার করে আপনি List, Set, Map এবং অন্যান্য কোলেকশনের উপাদানগুলোকে কাস্টমাইজড অর্ডারে সাজাতে পারবেন।
Comparator Interface এর মেথডগুলো:
compare(T o1, T o2): দুইটি অবজেক্টের তুলনা করে তাদের মধ্যে পার্থক্য নির্ধারণ করে। যদি প্রথম অবজেক্ট দ্বিতীয়টির চেয়ে ছোট হয় তবে negative value, সমান হলে 0 এবং বড় হলে positive value ফেরত দেয়।reversed(): এটি বর্তমান Comparator এর বিপরীত (reverse) Comparator তৈরি করে।thenComparing(Comparator<? super T> other): এটি প্রথম Comparator এর পরিমাণের সাথে দ্বিতীয় Comparator যোগ করে এবং একটি যৌথ Comparator তৈরি করে।
Comparator Interface ব্যবহার করে Custom Sorting
1. Comparator এর সাথে Custom Sorting উদাহরণ:
ধরা যাক, আমরা একটি Person ক্লাস তৈরি করেছি এবং আমরা তার নাম (name) এবং বয়স (age) এর উপর ভিত্তি করে সাজাতে চাই।
import java.util.*;
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
}
public class ComparatorExample {
public static void main(String[] args) {
// Create a list of people
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 25));
people.add(new Person("Bob", 20));
people.add(new Person("Charlie", 30));
// Sort by age using custom comparator
people.sort(new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
return Integer.compare(p1.age, p2.age); // Sorting by age
}
});
System.out.println("Sorted by age:");
for (Person person : people) {
System.out.println(person);
}
}
}
Output:
Sorted by age:
Person{name='Bob', age=20}
Person{name='Alice', age=25}
Person{name='Charlie', age=30}
ব্যাখ্যা:
- এখানে
Comparatorইন্টারফেস ব্যবহার করে Person অবজেক্টগুলোকে age এর উপর ভিত্তি করে সাজানো হয়েছে। compare()মেথডে Integer.compare(p1.age, p2.age) ব্যবহার করা হয়েছে, যা দুইটি বয়সের তুলনা করে তাদের পার্থক্য নির্ধারণ করে।
2. Comparator ব্যবহার করে প্রথম নাম এবং তারপর বয়স অনুযায়ী সজ্জিত করা:
এখন, ধরুন আমরা চাই Person অবজেক্টগুলোকে প্রথমে নাম (name) এবং পরে বয়স (age) অনুযায়ী সাজাতে।
import java.util.*;
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
}
public class ComparatorExample {
public static void main(String[] args) {
// Create a list of people
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 25));
people.add(new Person("Bob", 20));
people.add(new Person("Charlie", 30));
people.add(new Person("Bob", 22));
// Sorting by name first, then age using custom comparator
people.sort(Comparator.comparing(Person::getName).thenComparingInt(Person::getAge));
System.out.println("Sorted by name and then age:");
for (Person person : people) {
System.out.println(person);
}
}
}
Output:
Sorted by name and then age:
Person{name='Alice', age=25}
Person{name='Bob', age=20}
Person{name='Bob', age=22}
Person{name='Charlie', age=30}
ব্যাখ্যা:
Comparator.comparing()মেথডটি প্রথমে নামের (name) উপর সজ্জিত করে, এবংthenComparingInt()মেথডটি বয়সের (age) উপর সজ্জিত করার জন্য ব্যবহার করা হয়েছে।- এখানে প্রথমে নামের উপর এবং তারপর বয়সের উপর সজ্জিত করা হয়েছে।
3. Reverse Sorting:
Comparator.reverseOrder() মেথডের মাধ্যমে আপনি রিভার্স অর্ডারে (descending) সাজাতে পারেন।
import java.util.*;
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
}
public class ReverseSortExample {
public static void main(String[] args) {
// Create a list of people
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 25));
people.add(new Person("Bob", 20));
people.add(new Person("Charlie", 30));
// Sort in reverse order based on age using comparator
people.sort(Comparator.comparingInt(Person::getAge).reversed());
System.out.println("Sorted by age in reverse order:");
for (Person person : people) {
System.out.println(person);
}
}
}
Output:
Sorted by age in reverse order:
Person{name='Charlie', age=30}
Person{name='Alice', age=25}
Person{name='Bob', age=20}
ব্যাখ্যা:
Comparator.reversed()মেথডটি উল্টো (descending) অর্ডারে সাজানোর জন্য ব্যবহৃত হয়েছে।- এখানে age এর উপর ভিত্তি করে উপাদানগুলো উল্টো অর্ডারে সাজানো হয়েছে।
Comparator Interface এর সাথে Custom Sorting এর সুবিধা:
- Flexibility in Sorting: Comparator ইন্টারফেস ব্যবহারের মাধ্যমে আপনি custom sorting logic তৈরি করতে পারেন, যা সহজে বিভিন্ন ক্রাইটেরিয়ার উপর ভিত্তি করে সাজাতে সহায়তা করে।
- Multiple Criteria Sorting: আপনি একাধিক ক্রাইটেরিয়ার ভিত্তিতে সজ্জিত করতে পারেন, যেমন প্রথমে নাম এবং পরে বয়স, অথবা প্রথমে বয়স এবং পরে নাম ইত্যাদি।
- Separation of Concerns: Comparator ইন্টারফেস দিয়ে আপনি সজ্জা বা তুলনা লজিককে আলাদা রাখতে পারেন, যা কোডের রিডেবিলিটি এবং রক্ষণাবেক্ষণ উন্নত করে।
- Sorting in Reverse Order: Comparator.reverseOrder() ব্যবহার করে সহজে উল্টো (descending) অর্ডারে সাজানো সম্ভব।
Comparator Interface Java-তে কাস্টম সজ্জা (custom sorting) করতে অত্যন্ত গুরুত্বপূর্ণ। এটি আপনার কাস্টম লজিকের ভিত্তিতে List, Set, Map এবং অন্যান্য কোলেকশনের উপাদানগুলোকে সাজাতে সহায়তা করে। আপনি একাধিক ক্রাইটেরিয়া অনুযায়ী সজ্জিত করতে পারবেন, এবং রিভার্স অর্ডারেও সাজানো সম্ভব। Comparator এর মাধ্যমে আপনি সজ্জা লজিক আলাদা করে, আরও নমনীয় এবং রক্ষণাবেক্ষণযোগ্য কোড তৈরি করতে পারেন।
Collections.sort() মেথডটি Java.util প্যাকেজে অন্তর্ভুক্ত একটি অত্যন্ত গুরুত্বপূর্ণ মেথড, যা একটি List ইন্টারফেসের উপাদানগুলোকে সজ্জিত (sort) করতে ব্যবহৃত হয়। এই মেথডটি ডিফল্টভাবে natural ordering অনুসরণ করে, অর্থাৎ, যদি আপনার List-এ কোনো Comparable অবজেক্ট থাকে, তবে এটি তাদের natural order (যেমন, সংখ্যা অনুযায়ী, অক্ষর অনুযায়ী) অনুসারে সাজিয়ে দেবে।
Collections.sort() মেথডের বৈশিষ্ট্য:
- Natural Ordering:
- যদি List-এ থাকা উপাদানগুলি Comparable ইন্টারফেস ইমপ্লিমেন্ট করে, তবে
Collections.sort()তাদের natural order অনুযায়ী সাজায়। উদাহরণস্বরূপ, String এবং Integer ক্লাসগুলি ইতিমধ্যেই Comparable ইন্টারফেস ইমপ্লিমেন্ট করে এবং তাদের natural ordering রয়েছে।
- যদি List-এ থাকা উপাদানগুলি Comparable ইন্টারফেস ইমপ্লিমেন্ট করে, তবে
- Custom Sorting (Using Comparator):
- যদি আপনি List-এর উপাদানগুলো একটি কাস্টম অর্ডারে সাজাতে চান, তবে আপনি Comparator ব্যবহার করতে পারেন। এর মাধ্যমে আপনি কোন কন্ডিশন অনুযায়ী তালিকাটি সাজাতে চান তা নির্ধারণ করতে পারবেন।
- Stability:
Collections.sort()মেথডটি stable sort। অর্থাৎ, যদি দুটি উপাদান সমান হয়, তবে তাদের আপেক্ষিক অবস্থান পরিবর্তিত হবে না।
- Time Complexity:
Collections.sort()মেথডের time complexity হল O(n log n), যেখানে n হল List এর সাইজ। এটি Merge Sort বা Tim Sort অ্যালগরিদম ব্যবহার করে কাজ করে।
Collections.sort() মেথডের সাধারণ ব্যবহার:
1. Natural Ordering (Comparable Interface)
যখন আপনার List এর উপাদানগুলি Comparable ইন্টারফেস ইমপ্লিমেন্ট করে, তখন Collections.sort() মেথড তাদের natural ordering অনুযায়ী সাজিয়ে দেবে। উদাহরণস্বরূপ, String, Integer, Double ইত্যাদি ক্লাসগুলি Comparable ইন্টারফেস ইমপ্লিমেন্ট করে এবং তাদের জন্য ডিফল্ট natural ordering বিদ্যমান।
Example: Sorting Integers in Natural Order
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsSortExample {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(5);
numbers.add(2);
numbers.add(8);
numbers.add(1);
numbers.add(3);
// Sorting the list using Collections.sort() (Natural Ordering)
Collections.sort(numbers);
// Displaying the sorted list
System.out.println("Sorted List: " + numbers);
}
}
Output:
Sorted List: [1, 2, 3, 5, 8]
ব্যাখ্যা:
Collections.sort()মেথডটি Integer উপাদানগুলোকে natural ordering (অর্থাৎ, স্বাভাবিক সংখ্যা অনুযায়ী) অনুসারে সাজিয়ে দিয়েছে।
Example: Sorting Strings in Natural Order
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsSortStrings {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("Banana");
fruits.add("Apple");
fruits.add("Orange");
fruits.add("Grapes");
// Sorting the list using Collections.sort() (Natural Ordering)
Collections.sort(fruits);
// Displaying the sorted list
System.out.println("Sorted List of Fruits: " + fruits);
}
}
Output:
Sorted List of Fruits: [Apple, Banana, Grapes, Orange]
2. Custom Sorting Using Comparator
যখন আপনি উপাদানগুলোকে একটি কাস্টম শর্ত অনুযায়ী সাজাতে চান, তখন আপনি Comparator ইন্টারফেস ব্যবহার করতে পারেন। Comparator এর মাধ্যমে আপনি Collections.sort() মেথডে একটি কাস্টম তুলনা কৌশল সরবরাহ করতে পারেন।
Example: Custom Sorting Using Comparator (Sort by Length of Strings)
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class CollectionsSortWithComparator {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("Banana");
fruits.add("Apple");
fruits.add("Orange");
fruits.add("Grapes");
// Custom sorting using Comparator (Sorting by string length)
Collections.sort(fruits, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
});
// Displaying the sorted list based on length of strings
System.out.println("Sorted List (By Length): " + fruits);
}
}
Output:
Sorted List (By Length): [Apple, Grapes, Orange, Banana]
ব্যাখ্যা:
- এখানে
Collections.sort()মেথডে একটি Comparator ব্যবহার করা হয়েছে যা String এর দৈর্ঘ্য অনুসারে তালিকাটি সাজিয়েছে। Comparator এর compare() মেথডে String গুলোর দৈর্ঘ্য তুলনা করা হয়েছে।
Example: Sorting by Reverse Order (Using Lambda Expression)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsSortReverseOrder {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(5);
numbers.add(2);
numbers.add(8);
numbers.add(1);
numbers.add(3);
// Sorting the list in reverse order using Lambda Expression
Collections.sort(numbers, (a, b) -> b - a);
// Displaying the sorted list in reverse order
System.out.println("Sorted List in Reverse Order: " + numbers);
}
}
Output:
Sorted List in Reverse Order: [8, 5, 3, 2, 1]
ব্যাখ্যা:
- Lambda Expression ব্যবহার করে Comparator এর মাধ্যমে সংখ্যাগুলিকে reverse order (অর্থাৎ, বড় থেকে ছোট) অনুযায়ী সাজানো হয়েছে।
Collections.sort()মেথডটি Java তে List ডেটা স্ট্রাকচারের উপাদানগুলিকে সাজানোর জন্য একটি খুবই গুরুত্বপূর্ণ এবং কার্যকরী মেথড।- এটি natural ordering অনুসরণ করে, তবে Comparator ব্যবহার করে আপনি custom sorting প্রয়োগ করতে পারেন।
Collections.sort()মেথডের time complexity সাধারণত O(n log n), এবং এটি stable sort (এখানে সমান উপাদানগুলির আপেক্ষিক অবস্থান অপরিবর্তিত থাকে)।
এটি কার্যকরীভাবে ব্যবহার করে আপনি List এর উপাদানগুলোকে সহজে সাজাতে পারেন, এবং প্রয়োজনে কাস্টম অর্ডারেও সাজাতে পারেন।
Java java.util প্যাকেজটি Collections Framework এর অংশ হিসেবে অনেক ধরনের ডেটা স্ট্রাকচার এবং মেথড প্রদান করে, যার মাধ্যমে বিভিন্ন ধরনের অবজেক্ট সঠিকভাবে সংরক্ষণ, অ্যাক্সেস এবং সাজানো যায়। একটি Complex Object হচ্ছে এমন একটি অবজেক্ট যেটি একাধিক প্রপার্টি ধারণ করে এবং সেটি সাধারণত Object ক্লাসের জন্য তৈরি করা হয়।
এখানে আমরা দেখব কিভাবে Complex Object Sorting করা যায়, যা একটি তালিকায় (List) থাকা Custom Objects কে sort করার জন্য Comparator বা Comparable ইন্টারফেস ব্যবহার করে।
Scenario: Sorting a List of Employees
ধরা যাক, আমাদের কাছে একটি Employee ক্লাস রয়েছে যার মধ্যে id, name, এবং salary নামক তিনটি প্রপার্টি রয়েছে। আমরা চাই যে, এই Employee অবজেক্টগুলিকে salary অনুযায়ী সাজাতে।
Step 1: Creating the Employee Class
প্রথমে আমরা একটি Employee ক্লাস তৈরি করব যেখানে তিনটি প্রপার্টি থাকবে: id, name, এবং salary।
public class Employee {
private int id;
private String name;
private double salary;
// Constructor
public Employee(int id, String name, double salary) {
this.id = id;
this.name = name;
this.salary = salary;
}
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
// toString() method for printing employee details
@Override
public String toString() {
return "Employee{id=" + id + ", name='" + name + "', salary=" + salary + "}";
}
}
Step 2: Sorting Employees Using Comparable Interface
এখন আমরা Comparable ইন্টারফেস ব্যবহার করে Employee অবজেক্টগুলোকে salary অনুযায়ী সাজাবো।
Comparable ইন্টারফেসে compareTo() মেথডটি ইনপুট অবজেক্টের সাথে বর্তমান অবজেক্টের তুলনা করার জন্য ব্যবহৃত হয়। compareTo() মেথডটি negative, zero, বা positive ভ্যালু রিটার্ন করে, যা sorting order নির্ধারণ করে।
Employee Class Modified with Comparable Interface:
public class Employee implements Comparable<Employee> {
private int id;
private String name;
private double salary;
public Employee(int id, String name, double salary) {
this.id = id;
this.name = name;
this.salary = salary;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
@Override
public int compareTo(Employee other) {
// Sorting by salary in ascending order
return Double.compare(this.salary, other.salary);
}
@Override
public String toString() {
return "Employee{id=" + id + ", name='" + name + "', salary=" + salary + "}";
}
}
Step 3: Sorting the List of Employees
এখন একটি List তৈরি করে, আমরা Collections.sort() মেথড ব্যবহার করে Employee অবজেক্টগুলোকে salary অনুসারে সাজাবো।
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class EmployeeSortExample {
public static void main(String[] args) {
// Creating Employee objects
Employee e1 = new Employee(1, "John", 50000);
Employee e2 = new Employee(2, "Alice", 60000);
Employee e3 = new Employee(3, "Bob", 45000);
// Adding employees to the list
List<Employee> employees = new ArrayList<>();
employees.add(e1);
employees.add(e2);
employees.add(e3);
// Sorting employees by salary using Comparable (in ascending order)
Collections.sort(employees);
// Displaying the sorted list
for (Employee emp : employees) {
System.out.println(emp);
}
}
}
Output:
Employee{id=3, name='Bob', salary=45000.0}
Employee{id=1, name='John', salary=50000.0}
Employee{id=2, name='Alice', salary=60000.0}
Explanation:
compareTo()মেথডেsalaryঅনুযায়ী তুলনা করা হয়েছে, ফলেEmployeeঅবজেক্টগুলো ascending order (অর্থাৎ কম থেকে বেশি) অনুসারে সাজানো হয়েছে।
Step 4: Sorting Employees Using Comparator Interface
যদি আপনি Comparable ব্যবহার না করে custom sorting করতে চান, তবে আপনি Comparator ইন্টারফেস ব্যবহার করতে পারেন। এটি আপনাকে একাধিক ক্রমে (যেমন নাম বা id) অবজেক্টগুলো সাজানোর সুযোগ দেয়।
Creating a Custom Comparator to Sort by Name:
import java.util.Comparator;
public class EmployeeNameComparator implements Comparator<Employee> {
@Override
public int compare(Employee e1, Employee e2) {
// Sorting by name in alphabetical order
return e1.getName().compareTo(e2.getName());
}
}
Step 5: Sorting Employees by Name Using Comparator
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class EmployeeSortByNameExample {
public static void main(String[] args) {
Employee e1 = new Employee(1, "John", 50000);
Employee e2 = new Employee(2, "Alice", 60000);
Employee e3 = new Employee(3, "Bob", 45000);
List<Employee> employees = new ArrayList<>();
employees.add(e1);
employees.add(e2);
employees.add(e3);
// Sorting employees by name using Comparator
Collections.sort(employees, new EmployeeNameComparator());
// Displaying the sorted list by name
for (Employee emp : employees) {
System.out.println(emp);
}
}
}
Output:
Employee{id=2, name='Alice', salary=60000.0}
Employee{id=3, name='Bob', salary=45000.0}
Employee{id=1, name='John', salary=50000.0}
Explanation:
- এখানে
Comparatorব্যবহার করেEmployeeঅবজেক্টগুলোকে name অনুযায়ী সাজানো হয়েছে, যেখানে alphabetical order অনুসরণ করা হয়েছে।
ComparableএবংComparatorইন্টারফেস Java তে complex objects সঠিকভাবে সাজানোর জন্য শক্তিশালী টুল।Comparableইন্টারফেস ব্যবহার করে আপনি একটি নির্দিষ্ট ক্রমে অবজেক্টগুলিকে সাজাতে পারেন, যেমন salary, কিন্তুComparatorব্যবহার করে আপনি একাধিক ক্রমে সাজানোর জন্য custom sorting করতে পারবেন (যেমন name, id ইত্যাদি)।Collections.sort()মেথড বাList.sort()মেথড ব্যবহার করে আপনি সহজেই complex objects সজ্জিত করতে পারবেন।
এই দুইটি ইন্টারফেস (Comparable এবং Comparator) প্রোগ্রামিংয়ে custom object sorting এর জন্য অত্যন্ত গুরুত্বপূর্ণ এবং Java Collections Framework-এ শক্তিশালী উপাদান হিসেবে ব্যবহৃত হয়।
Read more